# 高阶函数
# 变量可以指向函数

x = abs(-1010)
print(x)

f = abs
print(f(-123))


# 传入函数
# 既然变量可以指向函数，函数的参数能接收变量，那么一个函数就可以接收另一个函数作为参数，这种函数就称之为高阶函数。
# 一个最简单的高阶函数：
def add(x, y, f):
    return f(x) + f(y)

print(add(-5, 6, abs))

# Python内建了map()和reduce()函数

# map()函数接收两个参数，一个是函数，一个是Iterable，map将传入的函数依次作用到序列的每个元素，并把结果作为新的Iterator返回。


def fd(x):
	return x * x
 r = map(fd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
 list(r)

 # reduce把一个函数作用在一个序列[x1, x2, x3, ...]上，这个函数必须接收两个参数，reduce把结果继续和序列的下一个元素做累积计算，其效果就是：
 # reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

 from functools import reduce
 def add(x, y):
 	reduce x+y
 rdig = reduce(add,[1,2,3,4,5,6,7])
print(rdig)